home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 216_01 / anywhere.c < prev    next >
Text File  |  1980-01-01  |  24KB  |  766 lines

  1. /***************************************************************
  2. *                                   *
  3. *       WHERE                           *
  4. *                                   *
  5. * Where is a program to locate files on the PC hard disk.      *
  6. * It requires DOS 2.x or 3.x.                       *
  7. *                                   *
  8. * The command line syntax is:                       *
  9. * where [starting directory]filename.ext               *
  10. *                                   *
  11. * Written by Mark S. Ackerman                       *
  12. * PROGRAM IS WRITTEN IN MARK WILLIAMS  M W C 8 6  LANGUAGE     *
  13. * Copyright 1984, 1985 by Mark S. Ackerman.  Permission is     *
  14. * granted for unlimited copies if not sold or otherwise        *
  15. * exchanged for gain.                           *
  16. *  PUBLISHED IN PC TECH JOURNAL - OCT '85 - VOL 3, NO. 10      *
  17. *                                   *
  18. *  MODIFIED FOR LATTICE C VER 2.15 BY JOHN TEICHERT NOV 85     *
  19. *     Names shortened to 8 significant characters.           *
  20. *     Elimination of PTOREG() function                   *
  21. *     flag86 defined to return flags from intdosx()           *
  22. *     Use segread to set up regs for intdosx() function.       *
  23. *     Program modified to look for drive designator with colon.*
  24. *     DATE structure defined with bits high order to low order.*
  25. *     intrpt.h replaced with dos.h header file               *
  26. *     rindex() function replaced with strrchr() function.      *
  27. *                                   *
  28. *  MODIFIED FOR MICROSOFT V3 BY JOHN TEICHERT JAN 86.           *
  29. *     flag86 REDEFINED to dos_result for  intdosx() ax reg     *
  30. *     modified to use flag in REGS structure.               *
  31. *     DATE structure defined with bits low order to high order.*
  32. *     _stack will not produce large stack in ver 3.0 must use  *
  33. *         link option or exemod program.               *
  34. *                                   *
  35. *   Added Code And Became ANYWHERE  JOHN TEICHERT FEB 86       *
  36. *                                   *
  37. *    Taking advantange of V3 access to the environment      *
  38. *    string we set up the following.                *
  39. *                                   *
  40. *    1. An Environment String indicating what disk drives   *
  41. *       you want ANYWHERE to search as follows:           *
  42. *                                   *
  43. *       AWDISKS=d:[;d:[;d:;...d:]]                   *
  44. *                                   *
  45. *          where d: is the drive specifier for one or more  *
  46. *          fixed disk(s).                       *
  47. *                                   *
  48. *          drive specifiers are searched in the order they  *
  49. *          are entered.                       *
  50. *                                   *
  51. *    2. The user can specify the environment string with    *
  52. *       the use of the set command in the autoexec.bat file.*
  53. *       As an example:                       *
  54. *                                   *
  55. *        set awdisks=c:;e:;d:                   *
  56. *                                   *
  57. *       would be placed into the autoexec.bat file.           *
  58. *                                   *
  59. *    With this modification the user has extended directory *
  60. *    capabilities by automatically searching all disk drives*
  61. *    listed in the environment string or isolated to a      *
  62. *    single drive by placing a drive specifier in the       *
  63. *    command line argument string.                   *
  64. *                                   *
  65. *    Be sure to use the /stack option on the link with      *
  66. *    Microsoft V3 C compiler or stack problems will result  *
  67. *    if many subdirectories.  8K seems to work well.        *
  68. *                                   *
  69. ***************************************************************/
  70.  
  71.  
  72. /***************************************************************
  73. * The C header files                           *
  74. * These identify library routines like printf() and int86x()  *
  75. ***************************************************************/
  76.  
  77. #include <stdio.h>   /* standard i/o                  */
  78. #include <dos.h>     /* functions for DOS interrupt calls     */
  79.  
  80. /***************************************************************
  81. * Structure for MS-DOS date and time fields               *
  82. * See pages 4-6 and 4-7 of the DOS 2.1 technical           *
  83. * reference manual for more information                *
  84. * This structure is used in the next structure definition      *
  85. ***************************************************************/
  86.  
  87. struct msdos_date
  88.     {
  89.     unsigned ms_sec    : 5; /* time in 2 sec. int (5 bits)*/
  90.     unsigned ms_min    : 6; /* minutes (6 bits)          */
  91.     unsigned ms_hour   : 5; /* hours (5 bits)          */
  92.     unsigned ms_day    : 5; /* day of month (5 bits)      */
  93.     unsigned ms_month  : 4; /* month (4 bits)          */
  94.     unsigned ms_year   : 7; /* year since 1980 (7 bits)   */
  95.     };
  96.  
  97. /***************************************************************
  98. * Definition of DOS Disk Transfer Area (DTA)               *
  99. ***************************************************************/
  100.  
  101. /***************************************************************
  102. * Structure filled in by MS-DOS for interrupt 21 calls           *
  103. * See page 5-46 of the DOS 2.1 technical reference           *
  104. * manual for more information                       *
  105. ***************************************************************/
  106.  
  107. struct DTA
  108.     {
  109.     char    DTA_dosinfo[21];       /* used by DOS        */
  110.     char    DTA_attr;           /* file attribute byte    */
  111.     struct msdos_date DTA_date;    /* date struct. as above */
  112.     long    DTA_size;           /* file size        */
  113.     char    DTA_filename[13];      /* file name (w/o path)    */
  114.     };
  115.  
  116.  
  117. /***************************************************************
  118. *        Definitions of constants               *
  119. ***************************************************************/
  120.  
  121. #define carry_set 0x0001 /* mask for flag register           */
  122.              /* for carry bit               */
  123. #define no_type   0x00     /* no bits set on file attribute byte */
  124. #define directory_type     0x10 /* directory file bit on file    */
  125.                   /* info word               */
  126.  
  127. #define no_more_files     18    /* DOS return code for        */
  128.                 /* no more files        */
  129.  
  130. #define end_of_string     '\0'   /* C uses a binary zero to      */
  131.                 /* signal end of string     */
  132.  
  133. #define backslash '\\'   /* the backslash character           */
  134. #define colon      ':'    /* Drive separator  JT 11/85           */
  135. #define semicolon ';'   /* Environment string drive separator   */
  136.  
  137. char *month[] = {
  138.         "Jan","Feb","Mar","Apr","May","Jun",
  139.         "Jul","Aug","Sep","Oct","Nov","Dec"
  140.         };
  141.  
  142. char *time_of_day[2] = {"AM","PM"};
  143.  
  144.  
  145. /***************************************************************
  146. *        Define the type "filename"                     *
  147. *            to be a string of 65 characters  -JT   *
  148. ***************************************************************/
  149.  
  150. typedef char filename[65];           /* Change to 65 -JT             */
  151.  
  152. /***************************************************************
  153. *                                   *
  154. * The following filename strings are used in the program:      *
  155. *                                   *
  156. *    chk_str         filename to be searched for    *
  157. *                filename in the command line)  *
  158. *    dir_string        directory name to be searched  *
  159. *    new_dstr        directory name to be searched  *
  160. *                  on next recursive call       *
  161. *    cur_str         temporary string for searching *
  162. *                  in a specific directory      *
  163. ***************************************************************/
  164.  
  165.  
  166. /***************************************************************
  167. * Definition of any forward-referenced functions           *
  168. ***************************************************************/
  169.  
  170. char *DATE();
  171.  
  172. /***************************************************************
  173. *        Global variables                   *
  174. ***************************************************************/
  175.  
  176. filename chk_str;            /* this string "remembers" user input */
  177. union    REGS    r8086;            /* structure to allow access to indiv.*/
  178.                     /*   registers for interrupts          */
  179. struct    SREGS    s8086;            /*   structure for segment registers  */
  180. char        date_str[40];        /* print output string for dates      */
  181. unsigned    dos_result;        /* Return code from DOS           */
  182.  
  183. /**
  184. *    FOLLOWING CODE COMMENTED OUT FOR V3.0 SINCE CAN'T FIND A WAY TO DO IT
  185. *    WITH A VARIABLE.
  186. **/
  187.  
  188. /*int          _stack = 8192;       Insure large stack to support */
  189. /*                       recursion in look routine     */
  190.  
  191. /***************************************************************
  192. *        MAIN() -- the beginning of the code           *
  193. ***************************************************************/
  194.  
  195. main( argc, argv, envp )
  196. int    argc;
  197. char    *argv[];
  198. char    *envp[];            /* Version 3 pointer to environ */
  199. {
  200. /**
  201. *    External    function
  202. **/
  203. char            *strrchr();    /* Lattice function which searches */
  204.                     /* for